<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>6.原型关系详解与属性继承实例</title>
</head>

<body>
  <script>
    let hd = new Object();
    hd.name = "后盾人";
    Object.prototype.show = function () {
      console.log("hodunren.com");
    };
    hd.show();
    function User () { }

    console.dir(User);//ƒ User() arguments : null caller : null length : 0 name : "User"
    // prototype : {constructor: ƒ} [[FunctionLocation]] : 6.原型关系详解与属性继承实例.html:22
    // [[Prototype]] : ƒ () Function.prototype



    // User 是一个函数，必然包含 prototype属性，存储的是一个实例化的原型对象
    // User.prototype=>{__proto__} 已经实例化的原型对象必然有__proto__属性，指向实例化它的构造函数的prototype属性
    // User.prototype的原型对象是由 new Object() 实例化而来，Object() 就是它的构造函数，User.prototype.__proto_必然会指向 Object.prototype
    console.log(User.prototype.__proto__ === Object.prototype);//true
    // User 本身也是一个对象 它是由new Function() 创建出来的，包含了__proto__属性，指向构造函数Fuction.prototype
    console.log(User.__proto__ === Function.prototype);//true
    //Function.prototype 存储的是原型对象，必然包含__proto__属性，Function.prototype.__proto__指向Object.prototype
    console.log(Function.prototype.__proto__ === Object.prototype);//true
    
    // 左右两边都指向最顶层 Object.prototype 
    console.log(User.prototype.__proto__ === User.__proto__.__proto__);//true
    //Object.prototype是最顶层的原型，它的__proto___属性是null 
    console.dir(Object.prototype.__proto__);//null
    let xj = new User();
    xj.show(); // hodunren.com
    User.show(); // hodunren.com
    console.dir(Object); //ƒ Object()
    console.dir(User); // ƒ User()

  </script>
</body>

</html>